/**
 * 
 */
package com.xpec.c4.codec.manual;

import java.nio.ByteBuffer;
import java.util.ArrayList;
import java.util.Collection;

import com.xpec.c4.game.utility.GUID;

/**
 * 字节流手动解码
 * 
 * @author lipeilin
 * @2011-10-22 下午03:08:31
 * 
 */
public class BytesManualDecode {

	private ByteBuffer bb;

	/**
	 * 
	 */
	public BytesManualDecode(byte[] bytes) {
		bb = ByteBuffer.allocate(bytes.length);
		bb.put(bytes);
		bb.flip();
	}

	public float getFloat() {
		return bb.getFloat();
	}

	public int getInt() {
		return bb.getInt();
	}

	public short getShort() {
		return bb.getShort();
	}

	public byte getByte() {
		return bb.get();
	}

	public boolean getBoolean() {
		byte flag = bb.get();
		return flag == (byte) 0 ? false : true;
	}

	/**
	 * 获得字符串<br>
	 * 第一个short表示string长度，当string为null时，长度=-1<br>
	 * 后面为string的byte数据（utf8格式）
	 * 
	 * @return
	 * 
	 * @2011-10-24 下午03:49:08
	 */
	public String getString() {
		short stringLength = bb.getShort();
		if (stringLength < 0) {
			return null;
		}
		byte[] guidBytes = new byte[stringLength];
		bb.get(guidBytes);
		return new String(guidBytes);
	}

	public GUID getUUID() {
		boolean flag = getBoolean();
		if (!flag)
			return null;
		else
			return new GUID(bb.getInt(), bb.getInt(), bb.getInt());
	}

	/**
	 * 获得字符串<br>
	 * 第一个short表示string长度，当string为null时，长度=-1<br>
	 * 后面为string的byte数据（utf8格式）
	 * 
	 * @return
	 * 
	 * @2011-10-24 下午03:49:08
	 */
	public Collection<String> getCollectionString() {
		short length = bb.getShort();
		if (length < 0) {
			return null;
		}
		Collection<String> collectionString = new ArrayList<String>(length);
		for (int i = 0; i < length; i++) {
			collectionString.add(getString());
		}
		return collectionString;
	}

	/**
	 * 获得UUID Collection<br>
	 * 第一个short表示Collection长度<br>
	 * 后面为UUID数据
	 */
	public Collection<GUID> getCollectionUUID(){
		short length = bb.getShort();
		if(length<0){
			return null;
		}
		Collection<GUID> collectionUUID = new ArrayList<GUID>(length);
		for(int i = 0 ;i<length;i++){
			collectionUUID.add(getUUID());
		}
		return collectionUUID;
	}
	
	/**
	 * 获得byte[]<br>
	 * 第一个int表示数组长度，当数组为null时，长度=-1<br>
	 * 后面为byte数据
	 * 
	 * @return
	 * 
	 * @2011-10-24 下午03:49:08
	 */
	public byte[] getArrayByte() {
		int length = bb.getInt();
		if (length < 0) {
			return null;
		}

		byte[] bytes = new byte[length];
		bb.get(bytes);

		return bytes;
	}

}
